draw广告

简介

draw广告分为自渲染广告和模板广告,类型取决于三方SDK的支持情况。SDK 提供draw广告的数据绑定、点击事件的上报。

①自渲染广告:聚合SDK返回物料,由开发者在返回的CloooudMCanvasView类型的canvasView上进行子视图的自行渲染和展示。

②模板广告:聚合SDK直接返回渲染好的广告CloooudMCanvasView,开发者直接展示即可。

注意事项 ①需要确保在SDK初始化成功后再进行广告请求,否则可能导致广告请求加载失败。

②聚合维度广告是通过广告位ID发起广告请求的,切记不要使用混淆。

③在广告接入前需要明确各ADN对应聚合广告样式情况,以确保正确完成广告接入,避免由于广告类型不匹配导致接入报错等情况的发生。

④广告加载数量以平台配置数量为准,本地数量仅在平台配置为0时有效,目前本地配置支持的广告数量为 1 ~ 3。

⑤由于各广告平台对于包名校验规则不同,需确保在媒体平台填写的包名符合各adn平台规范,避免由于包名校验不匹配导致的无广告返回情况的产生。

⑥一定要设置rootViewController,即跳转落地页需要的viewController。

接入draw广告

// 创建广告对象
- (void)p_buildAd {
        CloooudAdSlot *adSlot = [[CloooudAdSlot alloc]init];
    adSlot.ID = self.viewModel.slotID; // 聚合维度通过广告位ID发起请求,
    self.drawAdsManager = [[CloooudNativeAdsManager alloc]initWithSlot:adSlot];

    self.drawAdsManager.delegate = self;
}
// 触发广告加载
- (void)p_loadAdData {
    [self.drawAdsManager loadAdDataWithCount:3];
}
// 收到load成功回调后展示
# pragma mark ---<CloooudMNativeAdsManagerDelegate>---
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager *)adsManager nativeAds:(NSArray<CloooudNativeAd *> *_Nullable)nativeAdDataArray{
    /// 注意,demo仅处理了首个广告
    CloooudNativeAd *model = nativeAdDataArray.firstObject;
    model.rootViewController = self;
    model.delegate = self;
    model.mediation.videoDelegate = self;

    CGFloat screenWidth = CGRectGetWidth(self.view.frame);
    CGFloat screenHeight = CGRectGetHeight(self.view.frame);
    CGFloat height = screenHeight - (CGRectGetMaxY(self.showAndRefreshAd.frame) + 20) - 100;
    CGFloat width = screenWidth * height / CGRectGetHeight(self.view.frame);
    CGFloat x = (screenWidth - width ) / 2;

    if (model.mediation.isExpressAd) {
        model.mediation.canvasView.frame = CGRectMake(x, CGRectGetMaxY(self.showAndRefreshAd.frame) + 20, width, height);
        [self.view addSubview:model.mediation.canvasView];
        [model.mediation render];
    } else {
        [_drawAdBackView removeFromSuperview];
        _drawAdBackView = [[CloooudMDDrawVideoAdView alloc] initWithFrame:CGRectMake(x, CGRectGetMaxY(self.showAndRefreshAd.frame) + 20, width, height)];
        _drawAdBackView.backgroundColor = [UIColor grayColor];

        __weak typeof(self) weakself = self;
        self.drawAdBackView.cellClose = ^(NSInteger index) {
            __strong typeof(self) strongself = weakself;
            [strongself.drawAdBackView removeFromSuperview];
        };
        [_drawAdBackView refreshUIWithModel:model];

        _drawAdBackView.drawAdView.mediation.videoDelegate = self;
        [self.view addSubview:_drawAdBackView];
    }
}

获取展示后广告信息示例

在收到加载成功回调后访问可获取到正确信息

- (void)logAdInfoAfterShow {
    CloooudMRitInfo *info = [self.drawAdsManager.mediation getShowEcpmInfo];
    // 展示后可获取信息如下
    NSLog(@"ecpm:%@", info.ecpm); // 单位:分
    NSLog(@"platform:%@", info.adnName);
    NSLog(@"ritID:%@", info.slotID);
    NSLog(@"requestID:%@", info.requestID ?: @"None");

    NSLog(@"getAdLoadInfoList:%@", [self.drawAdsManager.mediation getAdLoadInfoList]);
}

接口及回调说明

CloooudNativeAdsManager说明

方法 说明
@property (nonatomic, strong, nullable) CloooudAdSlot *adslot; 广告配置对象
@property (nonatomic, strong, nullable) NSArray<CloooudNativeAd > data;
@property (nonatomic, weak, nullable) id delegate; CloooudNativeAdsManagerDelegate,聚合维度使用CloooudMNativeAdsManagerDelegate
@property (nonatomic, weak, nullable) id nativeExpressAdViewDelegate; CloooudNativeExpressAdViewDelegate
@property (nonatomic, assign, readwrite) CGSize adSize; 广告尺寸
- (instancetype)initWithSlot:(CloooudAdSlot * _Nullable) slot; 创建广告对象
- (void)loadAdDataWithCount:(NSInteger)count; 加载广告数量
@property (nonatomic, strong, nullable, readonly) CloooudNativeAdsManagerMediation *mediation; 当使用聚合广告位时,存在该属性,可获取聚合维度相关功能

CloooudNativeAdsManagerMediationProtocol说明

方法 说明
@property (nonatomic, weak) UIViewController *rootViewController; 必要,设置广告详情跳转控制器
- (void)destory; 不再使用加载成功后回调的视图对象组时,可调用该方法释放占用的内存
@property (nonatomic, assign, readonly) BOOL isLoading; 广告是否加载中
- (void)addParam:(id)param withKey:(NSString *)key; 添加参数 param 参数值 key 参数key
- (NSArray<CloooudMAdLoadInfo > )getAdLoadInfoList; 一次waterfall中各adn代码位加载广告失败原因,建议调用时机:展示广告时/超时时/全部返回报错时;返回nil表示一次加载无代码位加载失败或其加载无响应

CloooudNativeAdsManagerDelegate说明

方法 说明
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager )adsManager nativeAds:(NSArray<CloooudNativeAd > *_Nullable)nativeAdDataArray; 加载成功
- (void)nativeAdsManager:(CloooudNativeAdsManager )adsManager didFailWithError:(NSError _Nullable)error; 加载失败

CloooudNativeAd说明

CloooudNativeAd为请求原生广告返回的广告类,可直接将CloooudMCanvasView添加到父视图上进行展示,目前仅支持frame布局方式,不支持自动布局。 | 方法 | 说明 | | --- | --- | |@property (nonatomic, weak, readwrite, nullable) id delegate;|CloooudNativeAdDelegate,聚合维度使用CloooudMNativeAdDelegate| |@property (nonatomic, strong, readwrite, nullable) CloooudAdSlot adslot;|广告对象| |@property (atomic, strong, readonly, nullable) CloooudMaterialMeta data;|物料信息| |@property (nonatomic, weak, readwrite) UIViewController rootViewController;|必要,设置广告详情跳转控制器| |- (instancetype)initWithSlot:(CloooudAdSlot )slot;|创建广告对象| |- (void)registerContainer:(kindof UIView *)containerView withClickableViews:(NSArray<kindof UIView > _Nullable)clickableViews;在原生广告视图中注册可点击视图。containerView:必要;原生广告的容器视图 clickableViews:可选;可点击的视图数组| |- (void)unregisterView;|取消注册视图| |- (void)loadAdData;|加载广告| |- (NSString )getAdCreativeToken;|物料ID 聚合维度不支持| |@property (nonatomic, strong, nullable, readonly) CloooudNativeAdMediation mediation;当使用聚合广告位时,存在该属性,可获取聚合维度相关功能|

CloooudNativeAdMediationProtocol说明

方法 说明
@property (nonatomic, assign, readonly) BOOL isExpressAd; 是否是模板广告,由adapter开发者实现
@property (nonatomic, strong, readonly, nonnull)CloooudMCanvasView *canvasView; 如果是模板广告可直接将该视图添加到需要展示的位置,如果是非模板广告可对该视图内部控件进行布局操作
@property (nonatomic, weak, readwrite, nullable) id videoDelegate; 视频播放代理协议对象
@property (nonatomic, weak, readwrite, nullable) id expressDelegate; 聚合混出模板广告时,模板广告代理协议对象
@property (nonatomic, strong, readonly) CloooudMVideoAdReporter *videoAdReporter; 自渲染视频类广告事件上报对象,仅采用自定义视频播放器时需要上报,部分ADN需申请白名单
- (void)render; [必要]渲染模板广告,开发者调用前无需区分是否为模板广告,Cloooud会自行处理
- (void)reSizeMediaView; 更新模板媒体视图大小
@property (nonatomic, assign, readonly) BOOL isReady; 是否已经准备广告展示,理论上在广告加载回调后即为YES,但受一些因素的影响(例如广告失效),可能为NO。建议在广告展示前调用该方法进行是否可以展示
- (nullable CloooudMRitInfo *)getShowEcpmInfo; 返回显示广告对应的披露信息
- (CloooudDictionary *_Nullable)extraData; 广告的扩展信息,可能为nil
- (NSArray<CloooudMRitInfo > )multiBiddingEcpmInfos; 填充后可调用,但推荐展示后调用,返回竞价广告的ecpm;当为server bidding ad时访问需要白名单权限;
- (NSArray<CloooudMRitInfo > )cacheRitList; 填充后可调用, 返回广告缓存池内所有信息;nil为无权限
- (CloooudMRitInfo *)getCurrentBestEcpmInfo; 填充后可调用,返回当前最佳广告的ecpm;当为server bidding ad时访问需要白名单权限
@property (nonatomic, copy, readonly) NSString *adViewID; 广告视图的唯一标识

CloooudMaterialMeta说明

自渲染广告物料信息

方法 说明
@property (nonatomic, assign) CloooudInteractionType interactionType; 交互类型
@property (nonatomic, strong) NSArray<CloooudImage > imageAry; 图片数组
@property (nonatomic, strong) CloooudImage *icon; logo图标
@property (nonatomic, copy) NSString *AdTitle; 广告标题
@property (nonatomic, copy) NSString *AdDescription; 广告描述
@property (nonatomic, copy) NSString *source; 广告源
@property (nonatomic, copy) NSString *buttonText; 创意区域按钮文本
@property (nonatomic, assign) CloooudFeedADMode imageMode; 广告样式
@property (nonatomic, assign) NSInteger score; 评分
@property (nonatomic, assign) NSInteger commentNum; 评论数
@property (nonatomic, assign) NSInteger appSize; app大小
@property (nonatomic, assign) NSInteger videoDuration; 视频时长
@property (nonatomic, copy, readonly) NSString *videoUrl; 视频url
@property (nonatomic, assign, readonly) BOOL allowCustomVideoPlayer; 自定义播放器
@property (nonatomic, assign, readonly) NSInteger videoResolutionWidth; 视频分辨率宽度 聚合维度不支持此场景
@property (nonatomic, assign, readonly) NSInteger videoResolutionHeight; 视频分辨率高度 聚合维度不支持此场景
@property (nonatomic, copy) NSArray<CloooudDislikeWords > filterWords; dislike原因
@property (nonatomic, copy) NSDictionary *mediaExt; 配置参数
@property (nonatomic, copy) NSString *ADXName; adx名称
@property (nonatomic, strong) CloooudAdGroupInfo groupInfo; - (instancetype)initWithDictionary:(NSDictionary )dict error:(NSError __autoreleasing )error; 聚合维度不支持此场景
@property (nonatomic, strong, nullable, readonly) CloooudMaterialMetaMediation *mediation; 当使用聚合广告位时,存在该属性,可获取聚合维度相关功能

CloooudMaterialMetaMediationProtocol说明

方法 说明
@property (nonatomic, strong, readonly, nullable) CloooudImage *adLogo; 广告adn的logo,如果logo有宽高,请尽量配置width和height
@property (nonatomic, assign, readonly) CGFloat videoAspectRatio; 视频纵横比(width/height),如果没有值或者异常返回0
@property (nonatomic, strong, readonly, nullable) NSString *appPrice; app购买价格,例如'免费',没有则为nil
@property (nonatomic, copy, readonly, nullable) NSString *advertiser; 广告商标识,广告商的名称或者链接
@property (copy, nonatomic, readonly, nullable) NSString *brandName; 品牌名称,若广告返回中无品牌名称则为空

CloooudMCanvasView说明

控件信息

方法 说明
@property (nonatomic, strong, readonly, nullable) CloooudMaterialMeta *data; 非模板Native广告的物料数据,模板广告时为nil
@property (nonatomic, assign, readonly) BOOL hasSupportActionBtn; 是否支持自定义事件按钮,如果为YES,开发者可以配置 callToActionBtn 的UI数值,默认为YES
@property (nonatomic, strong, readonly, nonnull) UILabel *titleLabel; 广告标题,需要开发者根据广告物料自己指定展示内容
@property (nonatomic, strong, readonly, nonnull) UILabel *descLabel; 广告描述,需要开发者根据广告物料自己指定展示内容
@property (nonatomic, strong, nullable) UIImageView *iconImageView; 广告图标,可能不存在,需要开发者根据广告物料自己指定展示内容
@property (nonatomic, strong, readonly, nonnull) UIImageView *imageView; 广告大图,需要开发者根据广告物料自己指定展示内容,系统会自动创建,但内容需开发者自行校验
@property (nonatomic, strong, readonly, nonnull) UIButton *callToActionBtn; 广告详情/下载按钮,可能不存在,文案内容需要开发者根据广告物料自己获取
@property (nonatomic, strong, nullable) UIView *advertiserView; 广告商视图,可能不存在,开发者可自行赋值处理
@property (nonatomic, strong, nullable) UIButton *dislikeBtn; 广告关闭按钮,可能不存在,开发者需自行处理响应事件
@property (nonatomic, strong, nullable) UIView *adLogoView; 广告LOGO视图,可能不存在,需要开发者根据广告物料自己指定展示内容
@property (nonatomic, strong, readonly, nullable) UIView *mediaView; 媒体视图,即视频广告的视频图层,非视频广告不存在该视图
- (void)registerClickableViews:(nullable NSArray<UIView > )views; 注册可点击区域,由Cloooud透传数据,是否生效由adapter 和 adn 决定 views 可响应点击操作的视图

CloooudNativeAdDelegate说明

方法 说明
- (void)nativeAdDidLoad:(CloooudNativeAd *)nativeAd; 加载成功
- (void)nativeAdDidLoad:(CloooudNativeAd )nativeAd view:(UIView _Nullable)view; 加载成功 推荐使用
- (void)nativeAd:(CloooudNativeAd )nativeAd didFailWithError:(NSError _Nullable)error; 加载失败
- (void)nativeAdDidBecomeVisible:(CloooudNativeAd *)nativeAd; 广告展示
- (void)nativeAdDidCloseOtherController:(CloooudNativeAd *)nativeAd interactionType:(CloooudInteractionType)interactionType; 此方法在另一个控制器关闭时调用。 interactionType:在app中打开appstore或打开网页或查看视频广告详情页面。
- (void)nativeAdDidClick:(CloooudNativeAd )nativeAd withView:(UIView _Nullable)view; 广告点击
- (void)nativeAd:(CloooudNativeAd _Nullable)nativeAd dislikeWithReason:(NSArray<CloooudDislikeWords > *_Nullable)filterWords; dislike原因
@protocol CloooudMNativeAdDelegate CloooudMNativeAdDelegate
- (void)nativeAdWillPresentFullScreenModal:(CloooudNativeAd *_Nonnull)nativeAd; 广告即将展示全屏页面/商店时触发 nativeAd 广告视图

CloooudMNativeAdExpressDelegate说明

方法 说明
- (void)nativeAdExpressViewRenderSuccess:(CloooudNativeAd *_Nonnull)nativeAd; 渲染成功
- (void)nativeAdExpressViewRenderFail:(CloooudNativeAd _Nonnull)nativeAd error:(NSError _Nullable)error; 渲染失败
- (void)nativeAdExpressViewDidBecomeVisible:(CloooudNativeAd *_Nonnull)nativeAd; 广告展示
- (void)nativeAdExpressViewDidClick:(CloooudNativeAd _Nonnull)nativeAd withView:(UIView _Nullable)view; 广告点击
- (void)nativeAdExpressViewWillPresentFullScreenModal:(CloooudNativeAd *_Nonnull)nativeAd; 广告即将展示全屏页面/商店时触发
- (void)nativeAdExpressView:(CloooudNativeAd _Nullable)nativeAd dislikeWithReason:(NSArray<CloooudDislikeWords > *_Nullable)filterWords; 模板广告点击关闭时触发 nativeAd 广告视图 filterWords 广告关闭原因,adapter开发者透传数据
- (void)nativeAdExpressViewDidDismissFullScreenModal:(CloooudNativeAd *_Nonnull)nativeAd; 广告即将退出全屏页面/商店时触发

CloooudMNativeAdVideoDelegate说明

方法 说明
- (void)nativeAdVideo:(CloooudNativeAd *_Nullable)nativeAd stateDidChanged:(CloooudPlayerPlayState)playerState; 当视频播放状态改变之后触发 nativeAd 广告视图 playerState 变更后的播放状态
- (void)nativeAdVideoDidClick:(CloooudNativeAd *_Nullable)nativeAd; 广告视图中视频视图被点击时触发 nativeAd 广告视图
- (void)nativeAdVideoDidPlayFinish:(CloooudNativeAd *_Nullable)nativeAd; 广告视图中视频播放完成时触发 nativeAd 广告视图

完整接入示例

- (void)loadDrawAd {
    if (self.drawAdsManager) {
        // 销毁上次广告对象
        [self.drawAdsManager.mediation destory];
    }

    CloooudAdSlot *slot = [[CloooudAdSlot alloc] init];
    slot.ID = @"广告位ID"; // 聚合维度通过广告位ID发起请求,
    slot.adSize = CGSizeMake(375, 150); // 尺寸根据实际情况设置

    slot.mediation.mutedIfCan = YES; // 静音 聚合功能

    CloooudNativeAdsManager *drawAdsManager = [[CloooudNativeAdsManager alloc] initWithSlot:slot];
    drawAdsManager.mediation.rootViewController = self;
    drawAdsManager.delegate = self;
    self.drawAdsManager = drawAdsManager;

    [self.drawAdsManager loadAdDataWithCount:3]; //加载广告数量,支持1-3个
}

/******** draw信息流广告加载回调处理 *********/
# pragma mark CloooudMNativeAdsManagerDelegate
// 广告加载成功
- (void)nativeAdsManagerSuccessToLoad:(CloooudNativeAdsManager *)adsManager nativeAds:(NSArray<CloooudNativeAd *> *_Nullable)nativeAdDataArray {

    for (CloooudNativeAd *model in nativeAdDataArray) {

        model.rootViewController = self;
        model.delegate = self;
        if (model.mediation.isExpressAd) {
            [model.mediation render];
        } else {
            // 开发者需自行渲染广告,渲染到model.mediation.canvasView上
            // 可以通过model.data.imageMode判断广告样式(大图/视频/组图...)
            // 可以通过model.data.imageAry获取图片数据
            // 可以通过model.data.AdTitle获取广告标题
            // 详情请查看接入文档
            [self customRenderAd:model];
        }

        /*  (注意: getShowEcpmInfo 只需要在当前 adView show 之后调用, show 之前调用该方法会返回 nil)
        CloooudMRitInfo *info = [model.mediation getShowEcpmInfo];
        NSLog(@"ecpm:%@", info.ecpm);
        NSLog(@"platform:%@", info.adnName);
        NSLog(@"ritID:%@", info.slotID);
        NSLog(@"requestID:%@", info.requestID ?: @"None");
        */

        CloooudDictionary *mediaExt = model.mediation.extraData;
        if (mediaExt) {
            NSLog(@"coupon:%@", mediaExt[@"coupon"]);
            NSLog(@"live_room:%@", mediaExt[@"live_room"]);
            NSLog(@"product:%@", mediaExt[@"product"]);
        }

        // 展示广告
        if (model.mediation.canvasView) {
            [self.view addSubview:model.mediation.canvasView];
        }
    }
}

// 广告加载失败
- (void)nativeAdsManager:(CloooudNativeAdsManager *)adsManager didFailWithError:(NSError *_Nullable)error {

}

详细示例请参见Demo。